import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class ReflectDemo4 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //获取class字节码文件对象
        Class c = Class.forName("Student");

        //获取里面所有的方法（包含父类的所有公共方法）
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        //获取里面所有的方法（不能获取父类的，但可以获取本类私有的）
        Method[] declaredMethods = c.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        System.out.println("===========================");
        //获取指定的单一方法
        Method sleep = c.getDeclaredMethod("sleep", String.class);
        System.out.println(sleep);

        //获取访问修饰符
        int modifiers = sleep.getModifiers();
        System.out.println(modifiers);

        //获取方法的名字
        String name = sleep.getName();
        System.out.println(name);

        //获取方法的形参
        Parameter[] parameters = sleep.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }
        //获取方法抛出的异常
        Class [] exceptionTypes = sleep.getExceptionTypes();
        for (Class exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }

        //方法运行
        /*Method类用于创建对象的方法
        Object invoke(Object obj,Object...args)
        参数一:用obj对象调用该方法
        参数二:"" 调用方法的传递的参数（如果没有就不写）
        返回值:方法的返回值，如果没有就不写
         */
        Student student = new Student();
        sleep.setAccessible(true);//暴力反射
        sleep.invoke(student,"");

    }
}
